package com.stone.dao.base;

import java.io.Serializable;
import java.util.List;

import com.stone.utils.Page;



/**
 * DAO 基类接口
 * @param <T> T POJO类型
 * @param <ID> ID类型
 */
public interface IBaseDao<T,ID extends Serializable>
{
	

	/**
	 * 获得持久化对象的类型
	 * @return
	 */
	public abstract Class<T> getPersistentClass();
	
	/**
	 * 存储对象
	 * @param entity
	 */
	public abstract void saveOrUpdate(T entity);
	
	/**
	 * 通过ID找对象
	 * @param entity
	 */
	public abstract T findById(ID id);
	
	/**
	 * 更新对象
	 * @param entity
	 */
	public abstract void update(T entity);
	
	/**
	 * 存储对象
	 * @param entity
	 */
	public abstract T save(T entity);
	
	/**
	 * 删除对象
	 * @param entity
	 */
	public abstract void delete(T entity);
	
	/**
	 * 与findByProperty相似，当properyName == value 时把相应的记录删除
	 */
	public abstract void deleteByProperty(String propertyName, Object value);
	
	/**
	 * 通过实例查找
	 * @param example
	 * @return
	 */
	public abstract List<T> findByExample(T example);
	
	/**
	 * 通过属性查找
	 * @param 	propertyName	属性名称
	 * @param 	value			属性的值
	 * @return
	 */
	public abstract List<T> findByProperty(String propertyName, Object value);
	
	/**
	 * 通过多个属性查找
	 * @param 	propertyNames	属性名称数组
	 * @param 	values			属性值数组
	 * @return
	 */
	public abstract List<T> findByPropertys(String[] propertyNames,Object[] values);
	
	/**
	 * 通过多个属性查找，并分页，
	 * 属性名称数组和属性值数组的序列要对应
	 * 
	 * @param	propertyNames	属性名称数组
	 * @param 	values			属性值数组
	 * @param 	page			页码
	 * @param 	pageSize		每页内容条数
	 * @return
	 */
	public List<T> findByPropertys(String[] propertyNames,Object[] values,int page,int pageSize);
	
	/**
	 * 通过属性查找，并分页，
	 * 属性名称数组和属性值数组的序列要对应
	 * 
	 * @param	propertyNames	属性名称
	 * @param 	values			属性值
	 * @param 	page			页码
	 * @param 	pageSize		每页内容条数
	 * @return
	 */
	public List<T> findByProperty(String propertyName,Object value,int page,int pageSize);
	
	/**
	 * 统计所有记录的总数
	 * @return 总数
	 */
	public int countAll();
	/**
	 * 统计数据库中当propertyName=value时的记录总数
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public int countByProperty(String propertyName, Object value);
	/**
	 *  统计数据库中当多个propertyName=value时的记录总数
	 * @param propertyNames	
	 * @param values
	 * @return
	 */ 
	public int countByPropertys(String[] propertyNames, Object[] values);
	

	/**
	 * 查找所有
	 * @return 要查询对象List
	 */
	public abstract List<T> findAll();
	
	/**
	 * 查找所有，并分页
	 * @param page     要返回的页号
	 * @param pageSize 页大小
	 * @return
	 */
	public abstract List<T> findAll(int page, int pageSize);
	
	
	/**
	 * 通过多属性查找，分页
	 * @param propertyNames
	 * @param values
	 * @param pageno
	 * @param pageSize
	 * @return
	 */
	public Page findByPropertys4Page(String[] propertyNames,Object[] values,int pageno, int pageSize);  
	  
    /**
     * 同通过查询字符串查找
     * @param queryString
     * @param values
     * @param pageno
     * @param pageSize
     * @return
     */
    public Page findByQueryString4Page(final String queryString,Object[] values,final int pageno,final int pageSize);  
  
    /**通过查询字符串查找获得记录数
     * @param queryString
     * @param params
     * @return
     */
    public int countByQueryString(String queryString,Object[] values);
    
    /**
     * 通过查询字符串查找
     * @param queryString
     * @param values
     * @return
     */
    public List<T> findByQueryString(String queryString,Object[] values);
    
    /**
     * 通过查询字符串查找
     * @param queryString
     * @return
     */
    public List<T> findByQueryString(String queryString);
    
}
